我曾協助某補教業的客戶建構企業內部的資料流程與儀表板。該公司在台灣有 200 間教室,於是,他們用 Metabase 做出了 200 個大同小異互動式儀表板,因為每間教室都需要一個。像這樣子的需求,有可能不使用手動作業,而是利用程式語言來做自動化生成嗎?
其實是辦得到的,因為 Metabase 也有提供 API ,換言之,Metabase 除了是一種 low code/no code 工具之外,它也提供了可程式化的介面。
然而,要直接去串接 Metabase 的 API ,還是有點吃力。最理想的情況是,如果有個函式庫 (library),可以對 Metabase 的 API 做一點抽象化,那自動化的程式寫起來就會輕鬆許多,這樣子一來,Metabase 就變成了繪圖引擎。
這邊有好消息、也有壞消息:
有時候,我們已經更新資料庫了,比方說,在資料庫裡新增了一張表 (table),但是,透過 Metabase 裡卻看不到。這是為什麼呢?
Metabase 其實會對與其連結的資料庫做一些掃描,並且把掃描完的結果快取下來。快取下的資訊通常是:「資料庫有哪些資料表、這些資料表的欄位是哪些、欄裡大概有哪裡值?」
為了處理快取失效的問題,我們可以手動強制 Metabase 立刻去更新快取:
承接上個問題,那如果我們已經知道,每天的某幾個時間點,我們的 EL 工具,可能會在資料庫裡新放入幾張新的表 (table),而且我們希望 Metabase 的強制更新快取,可以恰好發生在 EL 的工作完成後,立刻更新呢?
這種情況,就很適合透過 API 來觸發強制更新快取。這邊為了降低大家使用 Embedkit 的門檻,我準備了一個範例的 git repo, Automation。
作法:
dev/config.edn
填寫對應的參數clj -X automation.auto/run
在 Automation 內部,自動化的程式碼:
(defn run [opts]
(e/trigger-db-fn! conn (:db-name config) :sync_schema)
(e/trigger-db-fn! conn (:db-name config) :rescan_values))
仔細看的話,run
也就只是去觸發 /sync_schema
與 /rescan_values
兩個 API 而已。
clj -X automation.auto/create-card
clj -X automation.auto/create-dashboard
就我從事 IT 工作的經驗來講,有三件工作常常是 IT 系統從「可用」走向「好用」的最後一哩路,然而,要堅持紀律把它們做好卻頗為困難:
本文所示範的 Metabase 自動化,就是其中一件事。